package com.free.ext.web.spring.filter;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.util.HtmlUtils;

import java.util.regex.Pattern;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class XssCleanUtils {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/
    private static final String PATTERN_STRINT1 = "((.*)catch\\((.*)\\)(.*))|(data:text/html)|(javascript(:*))|((.*)\"(.*))|((.*)alert\\((.*)\\)(.*))|(eval\\((.*)\\))|(top\\[(.*)\\](.*))|((.*)\\\\x(.*))|(setTimeout\\((.*)\\))|(expression\\((.*)\\))|(expr(.*))|(expression(.*))|(console\\.log(.*))|";
    private static final String PATTERN_STRING2 = "(sql_debug)|((.*)select(.*))|(\\\\u(.*))|(\\\\00(.*))|(data:_;;;:;base64_______,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=)|(data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=)|(<<scr\0ipt/src=(.*)></script>)|";
    private static final Pattern pattern = Pattern.compile(PATTERN_STRINT1+PATTERN_STRING2 , Pattern.CASE_INSENSITIVE);
    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/

    public static String clean(String value)
    {
        if(StringUtils.isEmpty(value))
        {
            return null;
        }

        value = cleanJavascript(value);
        value = cleanSql(value);
        value = HtmlUtils.htmlEscape(value);

        return value;
    }

    public static String cleanSql(String value)
    {
        if(StringUtils.isEmpty(value))
        {
            return null;
        }
        return value.replaceAll(".*([';]+|(--)+).*", "");
    }

    public static String cleanJavascript(String value)
    {
        return pattern.matcher(value).replaceAll("");
    }

    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
